package inherit;

/**
 * Created with IntelliJ IDEA
 * Description:学习继承
 * User:22954
 * Date:2024-01-07
 * Time:20:37
 */

/**
 * 继承：对共性的抽取，从而达到对代码的复用
 */
class Animal {
    public String name;
    public String sex;

    public Animal() {
        this.name = "hh";
        this.sex = "male";
    }

    /**
     * 自己写构造方法初始化父类
     * 若构造方法中需要传参，在子类中需也需自写一个构造方法
     *
     * @param name
     * @param sex
     */
    public Animal(String name, String sex) {
        this.name = name;
        this.sex = sex;
    }

    public void eat() {
        System.out.println(name + "在吃饭");
    }
}

/**
 * 子类/派生类           父类/基类/超类
 * 子类   关键字(继承)    父类
 * Dog    extends    Animal
 * 子类继承父类后，可以调用父类所有变量和方法
 */
class Dog extends Animal {
    public boolean silly;

    /**
     * 要用需传参的父类构造方法，需写一个构造方法在子类
     * 若父类中只存在需传参的构造方法，就必须写一个引用父类构造方法的构造方法
     *
     * @param name
     * @param sex
     * @param silly
     */
    public Dog(String name, String sex, boolean silly) {
        super(name, sex);//父类构造方法用super()访问，必须在第一行
        this.silly = silly;
    }

    public Dog() {
//        super("aa", "female");
//        this("bb", "male", true);  //会编译错误，this()和super()不能同时存在于构造方法中
    }

    public void bark() {
        System.out.println(name + "汪汪叫");
    }
}

class Cat extends Animal {
    /**
     * 若父类有无需传参的构造方法
     * 子类无需另写构造方法，系统可自动生成
     */

    public void catchMouse() {
        System.out.println(name + "在抓老鼠");
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}

public class Test1 {
    public static void main(String[] args) {
        double a=Math.pow(1,2);
        Cat cat = new Cat();
        System.out.println(cat);
    }
}
